package br.com.futebol.util;

import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

import br.com.futebol.simulador.JogadorEscalado;
import br.com.futebol.simulador.Sim;
import br.com.futebol.simulador.Tatica;

/**
 * Cria a string JSON com os dados que precisam ser enviados para os jogadores da partida, para poder ser renderizado em
 * tela.
 * 
 * @author Thyago Schleuss - tschleuss@gmail.com
 * @since 28/09/2010
 */
public final class JSONResponse {

    private static final Logger LOG = Logger.getLogger(JSONResponse.class);

    /**
     * Construtor padrao privado
     */
    private JSONResponse() {
        super();
    }

    /**
     * Metodo responsavel por pegar todas as informacoes que dizem respeito ao jogo atual, e gerar o JSON com todas as
     * informacoes necessarias.
     * 
     * @param simulador Objeto simulador
     * @return JSON da jogada
     * 
     */
    public static String convertePartidaParaJSON(final Sim simulador) {

        final JSONArray jsonArray = new JSONArray();

        try {

            if (!isGameFinish(simulador)) {
                final Tatica taticaPlayer1 = simulador.getTaticaAtualE1().getTatica();
                final Tatica taticaPlayer2 = simulador.getTaticaAtualE2().getTatica();

                final List<JogadorEscalado> listaJogadoresE1 = taticaPlayer1.getListaJogadoresEscalados();
                final List<JogadorEscalado> listaJogadoresE2 = taticaPlayer2.getListaJogadoresEscalados();

                // Criar JSON com o saldo de gols de cada equipe ate o momento
                final JSONObject golsPlayer1 = new JSONObject();
                final JSONObject golsPlayer2 = new JSONObject();
                golsPlayer1.put("g1", simulador.getTempoPlacar().getGolsEquipe1());
                golsPlayer2.put("g2", simulador.getTempoPlacar().getGolsEquipe2());
                jsonArray.add(golsPlayer1);
                jsonArray.add(golsPlayer2);

                // Criar JSON com a posicao x,y da bola neste momento
                final JSONObject posicaoBolaX = new JSONObject();
                final JSONObject posicaoBolaY = new JSONObject();

                final String posX = String.valueOf(simulador.getBola().getPosicaoAtual().getX());
                final String posY = String.valueOf(simulador.getBola().getPosicaoAtual().getY());

                posicaoBolaX.put("bx", posX);
                posicaoBolaY.put("by", posY);
                jsonArray.add(posicaoBolaX);
                jsonArray.add(posicaoBolaY);

                // Criar JSON com o tempo atual do jogo
                final JSONObject tempoMs = new JSONObject();
                final JSONObject tempoMinutos = new JSONObject();
                tempoMs.put("t", simulador.getTempoPlacar().getTempo());
                tempoMinutos.put("m", simulador.getTempoPlacar().getMinutos());
                jsonArray.add(tempoMs);
                jsonArray.add(tempoMinutos);

                // Criar JSON com as informacoes de cada jogador da equipe 1
                final JSONArray jogadoresE1 = new JSONArray();
                for (final JogadorEscalado jog : listaJogadoresE1) {
                    final JSONObject jogador = new JSONObject();
                    // jogador.put("n", jog.getJogador().getNome());
                    jogador.put("c", jog.getJogador().getNumeroCamisa());
                    jogador.put("x", String.valueOf(jog.getJogador().getPosicaoAtual().getX()));
                    jogador.put("y", String.valueOf(jog.getJogador().getPosicaoAtual().getY()));
                    jogador.put("g", jog.getJogador().isGoleiro() ? "s" : "n");
                    jogadoresE1.add(jogador);
                }

                final JSONObject equipe1 = new JSONObject();
                equipe1.put("e1", jogadoresE1);
                jsonArray.add(equipe1);

                // Criar JSON com as informacoes de cada jogador da equipe 2
                final JSONArray jogadoresE2 = new JSONArray();
                for (final JogadorEscalado jog : listaJogadoresE2) {
                    final JSONObject jogador = new JSONObject();
                    // jogador.put("n", jog.getJogador().getNome());
                    jogador.put("c", jog.getJogador().getNumeroCamisa());
                    jogador.put("x", String.valueOf(jog.getJogador().getPosicaoAtual().getX()));
                    jogador.put("y", String.valueOf(jog.getJogador().getPosicaoAtual().getY()));
                    jogador.put("g", jog.getJogador().isGoleiro() ? "s" : "n");
                    jogadoresE2.add(jogador);
                }

                final JSONObject equipe2 = new JSONObject();
                equipe2.put("e2", jogadoresE2);
                jsonArray.add(equipe2);
            }

        } catch (final Exception e) {
            LOG.error("Erro ao criar JSON de resposta", e);
        }

        return jsonArray.toString();
    }

    /**
     * Converte o tamanho do repeteco para JSON.
     * 
     * @param Array de parametros
     * @return JSON
     */
    public static String criaJsonSimples(final Object[]... values) {
        final JSONObject objSize = new JSONObject();
        if (values != null) {
            for (Object[] obj : values) {
                objSize.put(obj[0], obj[1]);
            }
        }
        return objSize.toString();
    }

    /**
     * Verifica se terminou o jogo.
     * 
     * @param simulador
     * @return
     */
    private static boolean isGameFinish(final Sim simulador) {
        if (simulador.getTempoPlacar() == null || simulador.getCampo() == null || simulador.getBola() == null || simulador.getArbitro() == null) {
            return true;
        }

        return false;
    }
}
